<?php

class LcznController extends Controller {
	
	public function index() {

		if (!is_null($this->registry->entidad)) {
			
			$tabla = $this->registry->router->controller;
			$campos = $this->registry->entidad["campos"];
			$claves = $this->registry->entidad["claves"];
			
			$filtro = LcznEntidadDAO::filtroFkEntidad($tabla);
			$entidades = LcznEntidadDAO::consultar($tabla, $campos, $filtro);
			
			foreach ($campos as $campo) {
				$listado["cabecera"]["campos"][$campo->getNombre()] = $campo->getNombre();
			}
			$listado["cabecera"]["acciones"]["editar"] = "";
			$listado["cabecera"]["acciones"]["eliminar"] = "";
			
			$listado["cuerpo"] = array();
			
			$url = new Url();
			
			foreach ($entidades as $entidad) {
				$valorClaves = Util::valorClavesEntidad($entidad, $claves);
				foreach ($campos as $campo) {
					$metodo = "get".ucfirst($campo->getNombre());
					$registro["campos"][$campo->getNombre()] = $entidad->$metodo();
				}
				
				
				$url->cambia("accion", "edicion", true);
				$url->cambia("ids", $valorClaves, true);
				$rutaEditar = $url->ruta();
				$registro["acciones"]["editar"]["enlace"] = $rutaEditar;
				
				$url->cambia("accion", "eliminacion", true);
				$rutaEliminar = $url->ruta();
				$registro["acciones"]["eliminar"]["enlace"] = $rutaEliminar;
				
				$listado["cuerpo"][] = $registro; 	
			}
			
			$cuerpo = new Template();
			$cuerpo->listado = $listado;
			
			$url->cambia("accion", "edicion", true);
			$url->cambia("ids", null, true);
			
			$cuerpo->rutaNuevo = $url->ruta();
			
			$url->atras();
			$cuerpo->rutaAtras = $url->ruta();
			
			$this->registry->template->cuerpo = $cuerpo;
			$this->registry->template->accion = "listado";
			
			$this->registry->template->show('index');
		} else {
			$cuerpo = new Template();
			$this->registry->template->cuerpo = $cuerpo;
			$this->registry->template->accion = "portada";
			$this->registry->template->show("index");
		}
	}
	
	public function edicion() {
		
		$url = new Url();
		
		if (!is_null($this->registry->entidad)) {
			
			if (isset($_POST["grabar"])) {
				$ids = $this->actualizacion();
				if (!is_null($ids) && intval($ids) > 0) {
					$url->cambia("ids", $ids, true);				
					header("location: ". $url->ruta());
					die();
				}
			}

			$tabla = $this->registry->router->controller;
			$campos = $this->registry->entidad["campos"];
			$claves = $this->registry->entidad["claves"];
			$fks = $this->registry->entidad["fks"];
			
			$filtro = "";
			if ($this->registry->router->action == "edicion") {
				$filtro.= LcznEntidadDAO::filtroIdEntidad($claves);
			}

			$entidades = LcznEntidadDAO::consultar($tabla, $campos, $filtro);
			
			$control = $url->control();
			
			if (count($entidades) > 0) {
				$entidad = $entidades[0];
			} else {
				$entidad = new LcznEntidadVO();
				foreach ($campos as $campo) {
					$metodo = "set".ucfirst($campo->getNombre());
					$entidad->$metodo($campo->getDefecto());
					if (!is_null($campo->getRelacion())) {
						$relacion = $campo->getRelacion();
						if (isset($control[$relacion["tabla"]]["ids"])) {
							$entidad->$metodo($control[$relacion["tabla"]]["ids"]);
						}
					}
				}
			}	

			$regCampos = new Registry();

			foreach ($campos as $campo) {
				
				if (!is_null($campo->getRelacion())) {
					$relacion = $campo->getRelacion();
					if (isset($control[$relacion["tabla"]]["ids"])) {
						$campo->setDeshabilitado(true);
					}
				}
				
				$nombre = $campo->getNombre();
				$regCampos->$nombre = $campo;
				$this->registry->campos = $regCampos;
			}
			
			$this->registry->entidadVO = $entidad;
		}	
	}

	private function actualizacion() {

		$ids = $this->registry->router->ids;
		$tabla = $this->registry->router->controller;
		$campos = $this->registry->entidad["campos"];
	
		try {
			$entidad = new LcznEntidadVO();
			foreach ($campos as $campo) {
				
				if (isset($_POST[$campo->getNombre()])) {
					
					$valor = $_POST[$campo->getNombre()];
					
					$error = Validar::campo($campo, trim($valor));
					if ($error != "") { throw new Exception($error); }
				} else {
					if ($campo->getTipo() != "tinyint") {
						$campo->setDeshabilitado(true);
					}
				}
				
				$metodo = "set".ucfirst($campo->getNombre());
				switch($campo->getTipo()) {
					case "tinyint":
						$entidad->$metodo(intval(isset($_POST[$campo->getNombre()])));
						break;
					default:
						$entidad->$metodo($valor);
						break;
				}
			}

			if (is_null($ids)) {
				$ids = LcznEntidadDAO::insertar($tabla, $campos, $entidad);
			} else {
				LcznEntidadDAO::actualizar($tabla, $campos, $entidad);
			}
			
			return $ids;
			
		} catch(Exception $ex) {
			echo($ex->getMessage());
		}
	}
	
	public function eliminacion() {
		
		$tabla = $this->registry->router->controller;
		$claves = $this->registry->entidad["claves"];
		
		LcznEntidadDAO::eliminar($tabla, $claves);
		
		$ruta = __SITE_HOST."/".$this->registry->router->controller;
		
		header("location: ". $ruta);
	}

}

?>
